/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package JC.utileria;

/**
 *
 * @author cabarcas
 */
import JC.skin.vista.JCFrameReproductor;
import java.awt.*;
import java.applet.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import java.net.MalformedURLException;
import java.io.IOException;
import java.io.File;
import javax.media.*;
import javax.media.control.*;
import javax.media.protocol.ContentDescriptor;
import javax.media.rtp.*;
import javax.swing.Timer;

public class Reproductor extends Applet implements ControllerListener{

    private JCFrameReproductor jcfr=null;

    private Player player;
    private Processor processor;
    private Component barra_progreso,visualComponent,controlComponent;
    private TrackControl[] controlpista;
    private Control[] control;

    private boolean autoRepetir, configurado;
    private boolean mostrarTextoEstado;
    private boolean autoReproducir;

    private BitRateControl controlTasaBits = null;
    private FrameRateControl controlTasaCuadros = null;
    private RTPControl controlRTP = null;
    private CachingControl controlCache = null;

    private long longBarraProgreso;
    private long progBarraProgreso;
    private ReceptionStats estadisticasRTP = null;

    private Timer temporizador = null;
    private int intervalo;
    private ActionListener tareaPeriodica;

    public Reproductor(JCFrameReproductor jcfr){
         this(jcfr, true, true, true);

    }

    public Reproductor(JCFrameReproductor jcfr, boolean autoRepetir,
                         boolean autoReproducir, boolean mostrarTextoEstado) {
    this.jcfr = jcfr;
    this.autoRepetir = autoRepetir;
    this.autoReproducir = autoReproducir;
    this.mostrarTextoEstado = mostrarTextoEstado;
    //Mediante una clase interna anonima detallamos la tarea periodica
    tareaPeriodica = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        implementacionTareaPeriodica();
      }

            private void implementacionTareaPeriodica() {
                throw new UnsupportedOperationException("Not yet implemented");
            }
    };
    //Establecemos el intervalo de refresco en la UI de la información extra
    this.intervalo = 1000; //milisegundos
    //Creamos el objeto temporizador
    this.temporizador = new Timer(intervalo, tareaPeriodica);
  }
    
    public void init(String archivo,File f){
        
        setLayout(new BorderLayout());
		//URL base del documento HTML
//		URL codeBase = getCodeBase();
//                System.out.println(getDocumentBas);
		URL url = null;
		try{
//			Se crea URL para el archivo
			if ((url = new URL(f.toURL().getProtocol(), f.toURI().getHost(),f.toURI().getPort(), f.getAbsolutePath())) == null)
				System.err.println("No se puede construir URL para el archivo");
//			Se crea el reproductor
			player=Manager.createPlayer(url);
			player.addControllerListener(this);
                       configurado=true;
		}
		catch (MalformedURLException e){
			System.err.println("URL no valida");
		}
		catch (IOException e){
			System.err.println("Excepcion de Lectura/Escritura");
		}
		catch (NoPlayerException e){
			System.err.println("No existe reproductor");
		}
                catch(Exception e){
                    
                }
        
    }

    public boolean abrirContenidoMM(File f) {
            boolean exito = true;
            try {
              //Se crea URL para la cadena
              URL url = null;
              url = new URL(f.toURL().getProtocol(), f.toURL().getHost(), f.toURL().getPort(), f.getAbsolutePath());
              if (url == null) {
                System.err.println("No se puede construir URL para el archivo");
              }
              //Se crea el procesador JMF para la URL
              if (processor != null) {
                processor.stop();
                processor.deallocate();
              }
              processor = Manager.createProcessor(url);
              processor.addControllerListener(this);
              processor.configure();
            }
            //Se tratan las posibles excepciones
            catch (MalformedURLException e) {
              System.err.println("URL no valida");
              exito = false;
            }
            catch (IOException e) {
              System.err.println("Excepcion de Lectura/Escritura");
              exito = false;
            }
            catch (NoPlayerException e) {
              System.err.println("No existe reproductor");
              exito = false;
            }
            return exito;
      }
    private boolean esperandoDescriptorSalida;

      public boolean setDescriptorSalida(ContentDescriptor descriptorFormato) {
        boolean exito;
        if (esperandoDescriptorSalida) {
          exito = true;
          controlpista = processor.getTrackControls();
          for (int i = 0; i < controlpista.length; i++) {
            Format[] formatosPista = controlpista[i].getSupportedFormats();
            for (int j = 0; j < formatosPista.length; j++) {
              addFormato(formatosPista[j]);
            }
          }
          configurado = true;
        }
        else {
          exito = false;
        }
        return exito;
     }
      public boolean realizar() {
          boolean exito = false;
          if (configurado) {
              processor.realize();
              exito = true;
    }
    return exito;
    }


    public void play(){
        if(getPlayer()!=null)
            getPlayer().start();
    }
    public void stop(){

        if (player != null){
            player.stop();
            player.deallocate();
	}
//        if(visualComponent==null){
//            jcfr.remove(visualComponent);
//        }
//        if(controlComponent==null){
//            jcfr.remove(controlComponent);
//        }
        //jcfr.set
    }
    public void pause(){
        player.stop();
    }
    public synchronized  void controllerUpdate(ControllerEvent event) {

        if (player == null) return;
	 	//Qué evento se ha producido?
	 	if (event instanceof RealizeCompleteEvent){
	 		//Se añade el componente de visualización del reproductor y el de control
	 		if((visualComponent = player.getVisualComponent()) != null)
	 			add("Center",visualComponent);
	 		if ((controlComponent = player.getControlPanelComponent()) != null)
	 			add("South",controlComponent);
	 		validate();
		}
		else if (event instanceof EndOfMediaEvent){
			jcfr.nextTo();
		}
		else if (event instanceof ControllerErrorEvent){
			player = null;
			System.err.println(((ControllerErrorEvent)event).getMessage());
		}
        
    }

    /**
     * @return the player
     */
    public Player getPlayer() {
        
        return player;
    }

    /**
     * @param player the player to set
     */
    public void setPlayer(Player player) {
        this.player = player;
    }

    /**
     * @return the barra_progreso
     */
    public Component getBarra_progreso() {
        return barra_progreso;
    }

    /**
     * @param barra_progreso the barra_progreso to set
     */
    public void setBarra_progreso(Component barra_progreso) {
        this.barra_progreso = barra_progreso;
    }

    /**
     * @return the visualcomponent
     */
    public Component getVisualcomponent() {
        return visualComponent;
    }

    /**
     * @param visualcomponent the visualcomponent to set
     */
    public void setVisualcomponent(Component visualcomponent) {
        this.visualComponent = visualcomponent;
    }

    /**
     * @return the control
     */
    public Component getControl() {
        return controlComponent;
    }

    /**
     * @param control the control to set
     */
    public void setControl(Component control) {
        this.controlComponent = control;
    }

    private void addFormato(Format format) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    public boolean listo(ControllerEvent event){
        if(event instanceof EndOfMediaEvent)
            return true;
        else
            return false;
    }

}
